import java.util.ArrayList;
import java.util.List;

/*
 * 可变参数是java1.5之后出现的新特性
 *   使用前提：
 *       当方法的参数列表数据类型已经确定，但是参数的个数不确定，就可以使用可变参数
 *   使用格式：
 *       修饰符  返回值类型  方法名 （数据类型  ... 变量名）{}
 *   可变参数原理：
 *       可变参数的底层就是一个数组，根据传递参数的个数不同，会创建不同长度的数组，来存储这些参数
 *       传递参数的个数，可以是0个（不传递）1个、2个或多个
 *
 * 注意：
 *      1、一个方法只能有一个可变参数
 *      2、如果方法有多个参数，那么可变参数必须写在参数列表的末尾
 *
 *
 * */
public class VarArgs01 {
    public static void main(String[] args) {
        System.out.println(methodAdd(1, 2, 3, 4, 5, 5));
        System.out.println(methodAdd(12, 2));
        System.out.println(method("sa", 21.2, "123", 123.32, 3.4, 343, "a", "str", 'a'));
    }

    public static Object method(Object... objects) {
        //思考使用数组的效率是否会比ArrayList高，为什么？占用空间，复杂度。。。
        // int[] a = new int[objects.length];
        List<Integer> integers = new ArrayList<>();
        List<Double> doubles = new ArrayList<>();
        List<Float> floats = new ArrayList<>();
        List<Short> shorts = new ArrayList<>();
        float sum = 0;
        for (int i = 0; i < objects.length; i++) {
            if (objects[i] instanceof Integer) {
                integers.add((Integer) (objects[i]));
            } else if (objects[i] instanceof Double) {
                doubles.add((Double) objects[i]);
            } else if (objects[i] instanceof Float) {
                floats.add((Float) objects[i]);
            } else if (objects[i] instanceof Short) {
                shorts.add((Short) objects[i]);
            } else {
                continue;
            }
        }
        for (Integer integer : integers) {
            sum += integer;
        }
        for (Double aDouble : doubles) {
            sum += aDouble;
        }
        for (Float aFloat : floats) {
            sum += aFloat;
        }
        for (Short aShort : shorts) {
            sum += aShort;
        }
        float sum1;
        sum1 = sum;
        return sum1;
    }

    //定义一个方法 ,计算两个整数之和
    // public static int mehtodAdd(int a, int b) {
    //     return a + b;
    // }

    //当要计算0～n个整数和时，已知参数的数据类型，但不知道数据的个数，可以使用可变参数
    public static int methodAdd(int... arr) {
        int sum = 0;
        for (int i : arr) {
            sum += i;
        }
        return sum;
        //[I@38af3868，底层是一个数组
        //System.out.println(arr);
        //System.out.println(arr.length);
        //return 1;
    }


}
